package troisdimension.client;

import java.util.ArrayList;
import java.util.List;

import com.google.gwt.canvas.client.Canvas;
import com.google.gwt.canvas.dom.client.Context2d;

public class ConteneurForme {

	private ArrayList<Forme> listeObjet = null;

	public Forme getObjet(String id) {
		Forme o = null;
		for (Forme obj : this.listeObjet) {
			if (obj.getId().equals(id)) {
				o = obj;
			}
		}
		return o;
	}

	public void addListeObjet(Forme obj) {

		if (this.listeObjet == null) {
			this.listeObjet = new ArrayList<Forme>();
		}

		if (!this.listeObjet.contains(obj)) {
			this.listeObjet.add(obj);
		}
	}

	public void creer(List<Object> obj) {
		Context2d ctx = (Context2d) obj.get(0);
		String couleur = null; 
		PointCentral pC = null;
		
		if (obj.get(1).equals(TypeForme.CERCLE.toString())) {
			Point pt = (Point) obj.get(2);
			pC = (PointCentral) obj.get(5);
			ArrayList<Point> liste = new ArrayList<Point>();
			liste.add(pt);
			pC.setListePoint(liste);			
			int r = Integer.parseInt((String) obj.get(3));
			couleur = (String) obj.get(4);
			
			String id = (this.listeObjet == null) ? "0" : String
					.valueOf(this.listeObjet.size());
			Cercle cercle = new Cercle(id, pt , r ,couleur , pC);
			cercle.dessiner(ctx);
			this.addListeObjet(cercle);
			
		} else if (obj.get(1).equals(TypeForme.LIGNE.toString())) {
			ArrayList<Point> pts = extracted(obj);
			pC =  (PointCentral) obj.get(4);
			couleur = (String) obj.get(3);			
			pC.setListePoint(pts);
			
			String id = (this.listeObjet == null) ? "0" : String
					.valueOf(this.listeObjet.size());
			Ligne ligne = new Ligne(id, pts ,couleur, pC);
			ligne.dessiner(ctx);
			this.addListeObjet(ligne);
		} else if (obj.get(1).equals(TypeForme.STRUCTURE.toString())) {
			ArrayList<Point> pts = extracted(obj);
			pC =  (PointCentral) obj.get(4);
			couleur = (String) obj.get(3);			
			pC.setListePoint(pts);
			ArrayList<Forme> formes = (ArrayList<Forme>) obj.get(5);		
			
			String id = (this.listeObjet == null) ? "0" : String
					.valueOf(this.listeObjet.size());
			
			Structure str = new Structure(id ,formes,couleur);
			str.dessiner(ctx);
			this.addListeObjet(str);
		}
		
		
		
	}

	private ArrayList<Point> extracted(List<Object> obj) {
		return (ArrayList<Point>) obj.get(2);
	}
	
	public void effacer(Canvas canvas) {
    canvas.getContext2d().clearRect(0, 0, canvas.getCoordinateSpaceWidth(), canvas.getCoordinateSpaceHeight());
	int w = canvas.getCoordinateSpaceWidth();
	canvas.setCoordinateSpaceWidth(1);
	canvas.setCoordinateSpaceWidth(w);
	}
	
	public void dessiner(Context2d ctx){
		for (Forme forme : this.listeObjet) {
			forme.dessiner(ctx);
		}
	}

	public void replacer(Forme obj) {
		if (this.listeObjet.contains(obj)) {
			this.listeObjet.remove(obj);
    		this.listeObjet.add(obj);
		}		
	}

	public void deplacerPointCentralAll(String xCentral,String yCentral,String zCentral,String xAngle,String yAngle, String zAngle , String f) {
		if( this.listeObjet != null &&  this.listeObjet.size() > 0 ){
			for (Forme forme : this.listeObjet) {
				this.deplacerPointCentral(forme, xCentral, yCentral, zCentral, xAngle, yAngle,  zAngle,f);
			}
		}	
	}
	
	public void deplacerPointCentral(String id, String xCentral,String yCentral,String zCentral,String xAngle,String yAngle, String zAngle , String f) {
		  Forme obj = this.getObjet(id);	
		  this.deplacerPointCentral(obj, xCentral, yCentral, zCentral, xAngle, yAngle,  zAngle,f);
	}
	
	public void deplacerPointCentral(Forme obj,String xCentral,String yCentral,String zCentral,String xAngle,String yAngle, String zAngle , String f) {
		  if(obj != null && !(obj instanceof Structure)){
			  PointCentral ptC = obj.getPtCentral();			  
			  ptC.setValue(Double.parseDouble(xCentral),Double.parseDouble(yCentral),Double.parseDouble(zCentral),
					  Double.parseDouble(xAngle),Double.parseDouble(yAngle),Double.parseDouble(zAngle),  Double.parseDouble(f));
			  obj.setPtCentral(ptC);
			  
	       }
	}
	
	public Object[] getPoint(){
		ArrayList<String> listePoint = new ArrayList<String>();		
		for (Forme forme : this.listeObjet) {
			if(forme instanceof Cercle){
				listePoint.add(forme.getId().toString() + " : " + forme.getString());					
			}	
		}		
		return listePoint.toArray();
	}
	
}
